﻿using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace TTSClient.Models
{
    class RequestModel
    {
        [JsonProperty("common")]
        public RequestCommonModel Common { get; set; }
        [JsonProperty("business")]
        public RequestBusinessModel Business { get; set; }
        [JsonProperty("data")]
        public RequestDataModel Data { get; set; }
    }

    class RequestCommonModel
    {
        /// <summary>
        /// app_id	string	是	在平台申请的APPID信息
        /// </summary>
        [JsonProperty("app_id")]
        public string AppId { get; set; }
    }

    class RequestBusinessModel
    {
        public RequestBusinessModel()
        {
            Aue = "lame";
            Sfl = 1;
            //Auf = "audio/L16;rate=16000";
            Vcn = AppSetting.Current.VcnCode;
            Speed = AppSetting.Current.Speed;
            Volume = AppSetting.Current.Volume;
            //Pitch = 50;
            //Bgs = 0;
            Tte = nameof(Encoding.UTF8);
            //Reg = "0";
            //Rdn = "0";
        }

        /// <summary>
        /// aue	string
        /// 
        /// 音频编码，可选值：
        /// raw：未压缩的pcm
        /// lame：mp3 (当aue=lame时需传参sfl=1)
        /// speex-org-wb;7： 标准开源speex（for speex_wideband，即16k）数字代表指定压缩等级（默认等级为8）
        /// speex-org-nb;7： 标准开源speex（for speex_narrowband，即8k）数字代表指定压缩等级（默认等级为8）
        /// speex;7：压缩格式，压缩等级1~10，默认为7（8k讯飞定制speex）
        /// speex-wb;7：压缩格式，压缩等级1~10，默认为7（16k讯飞定制speex）
        /// 
        /// 示例:
        /// "raw"
        /// "speex-org-wb;7" 数字代表指定压缩等级（默认等级为8），数字必传
        /// 标准开源speex编码以及讯飞定制speex说明请参考音频格式说明
        /// </summary>
        [JsonProperty("aue")]
        public string Aue { get; set; }
        /// <summary>
        /// sfl	int 否
        /// 需要配合aue=lame使用，开启流式返回
        /// mp3格式音频
        /// 取值：1 开启
        /// </summary>
        [JsonProperty("sfl")]
        public int? Sfl { get; set; }
        /// <summary>
        /// auf	string	否
        /// 音频采样率，可选值：
        /// audio/L16;rate=8000：合成8K 的音频
        /// audio/L16;rate=16000：合成16K 的音频
        /// auf不传值：合成16K 的音频
        /// 
        /// 示例:
        /// "audio/L16;rate=16000"
        /// </summary>
        [JsonProperty("auf")]
        public string Auf { get; set; }
        /// <summary>
        /// vcn	string	是	发音人
        /// 可选值：请到控制台添加试用或购买发音人，添加后即显示发音人参数值	
        /// 
        /// 示例:
        /// "xiaoyan"
        /// </summary>
        [JsonProperty("vcn")]
        public string Vcn { get; set; }
        /// <summary>
        /// speed	int	否	语速
        /// 可选值：[0-100]，默认为50
        /// </summary>
        [JsonProperty("speed")]
        public int? Speed { get; set; }
        /// <summary>
        /// volume	int	否	音量
        /// 可选值：[0-100]，默认为50
        /// </summary>
        [JsonProperty("volume")]
        public int? Volume { get; set; }
        /// <summary>
        /// pitch	int	否	音高，可选值：[0-100]，默认为50
        /// </summary>
        [JsonProperty("pitch")]
        public int? Pitch { get; set; }
        /// <summary>
        /// bgs	int	否	合成音频的背景音
        /// 0:无背景音（默认值）
        /// 1:有背景音
        /// </summary>
        [JsonProperty("bgs")]
        public int? Bgs { get; set; }
        /// <summary>
        /// tte	string	是
        /// 文本编码格式
        /// GB2312
        /// GBK
        /// BIG5
        /// UNICODE(小语种必须使用UNICODE编码，合成的文本需使用utf16小端的编码方式，详见java示例)
        /// GB18030
        /// UTF8
        /// </summary>
        [JsonProperty("tte")]
        public string Tte { get; set; }
        /// <summary>
        /// reg	string	否
        /// 设置英文发音方式：
        /// 0：自动判断处理，如果不确定将按照英文词语拼写处理（缺省）
        /// 1：所有英文按字母发音
        /// 2：自动判断处理，如果不确定将按照字母朗读
        /// 默认按英文单词发音
        /// </summary>
        [JsonProperty("reg")]
        public string Reg { get; set; }
        /// <summary>
        /// rdn	string	否
        /// 合成音频数字发音方式
        /// 0：自动判断（默认值）
        /// 1：完全数值
        /// 2：完全字符串
        /// 3：字符串优先
        /// </summary>
        [JsonProperty("rdn")]
        public string Rdn { get; set; }
    }

    class RequestDataModel
    {
        public RequestDataModel()
        {
            Status = 2;
        }

        /// <summary>
        /// text	string	是	文本内容，需进行base64编码；
        /// base64编码前最大长度需小于8000字节，约2000汉字
        /// </summary>
        [JsonProperty("text")]
        public string Text { get; set; }
        /// <summary>
        /// status	int	是	数据状态，固定为2
        /// 注：由于流式合成的文本只能一次性传输，不支持多次分段传输，此处status必须为2。
        /// </summary>
        [JsonProperty("status")]
        public int Status { get; }
    }
}
